package framework.elements;

import static org.testng.AssertJUnit.assertEquals;

import java.util.Random;

import org.openqa.selenium.By;

/**
 * Класс, описывающий чекбокс.
 */
public class CheckBox extends BaseElement {

    public CheckBox(final By locator, final String name) {
        super(locator, name);
    }

    protected String getElementType() {
        return "CheckBox";
    }

    /**
     * Проверка значения чекбокса.
     * При неверном значении тест прекращает работу
     * @param expectedState
     *            Ожидаемое значение
     */
    public void assertState(boolean expectedState) {
        assertEquals(formatLogMsg(
                "Wrong value of a checkbox"), expectedState, isChecked());
    }

    /**
     * Установка чекбокса в true
     */
    public void check() {
        check(true);
    }

    /**
     * Установить указанное значение.
     * 
     * @param state
     *            Значение (true/false)
     */
    public void check(boolean state) {
        assertIsPresent();
        info(String.format("Setting value '%1$s'", state));
        if (state ^ isChecked()) {
            click();
        }
    }

    /**
     * Установить рандомное значение.
     * 
     * @return Установленное значение
     */
    public boolean checkRandom() {
        boolean state = new Random().nextBoolean();
        check(state);
        return state;
    }

    /**
     * Изменить значение чекбокса на противоположное.
     */
    public void toggle() {
        check(!isChecked());
    }

    /**
     * Установка чекбокса в false.
     */
    public void uncheck() {
        check(false);
    }
}
